package main

import (
	"context"
	"dict-server/config"
	"dict-server/controllers"
	router "dict-server/routers"
	"dict-server/services"
	"fmt"
	"log"
	"net/http"
	"os"
	"os/signal"
	"sync"
	"syscall"
	"time"
)

func main() {
	// 加载配置
	// 加载配置（无需传入文件路径，内部自动处理.env）
	config, err := config.Load()
	if err != nil {
		log.Fatalf("配置加载失败: %v", err)
	}

	// 初始化数据库服务
	if err := services.InitDB(&config.Database); err != nil {
		log.Fatalf("数据库初始化失败: %v", err)
	}
	defer services.CloseDB()

	// 创建Deepseek客户端实例
	deepseekService := services.NewDeepseekClient(&config.Deepseek)
	wordController := controllers.NewWordController(deepseekService)
	mux := router.NewRouter(wordController)

	// 创建服务器
	server := &http.Server{
		Addr:         fmt.Sprintf(":%d", config.Server.Port),
		Handler:      mux,
		ReadTimeout:  config.Server.ReadTimeout,
		WriteTimeout: config.Server.WriteTimeout,
	}

	// 标记服务器goroutine
	var wg sync.WaitGroup
	wg.Add(1)

	// 启动服务器
	go func() {
		// 服务器退出时完成标记
		defer wg.Done()
		log.Printf("服务器启动，监听端口: %d", config.Server.Port)
		if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			log.Fatalf("启动失败: %v", err)
		}
	}()

	// 等待中断信号
	sig := make(chan os.Signal, 1)
	signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
	<-sig
	log.Println("开始关闭服务器...")

	// 关闭服务器
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()
	if err := server.Shutdown(ctx); err != nil {
		log.Printf("关闭异常: %v", err)
	}

	// 等待服务器goroutine完全退出
	wg.Wait()
	log.Println("服务器已安全关闭")
}
